import vnode from './vnode'
import createElement from './createElement';
import patchVnode from './patchVnode';

// TODO: 将新旧节点替换，或者挂载到dom上
export default function patch (oldVnode, newVnode) {
    // 1 判断是否是虚拟节点
    if (!isVnode(oldVnode)) {
        // 包装成虚拟节点输出
        oldVnode = emptyNodeAt(oldVnode)
    }
    // 2 判断是否是同个节点
    if (sameVnode(oldVnode, newVnode)) {
        // 是，最小量化更新
        patchVnode(oldVnode, newVnode)
    }
    else {
        // 不是，全量更新
        let newDom = createElement(newVnode)
        let parent = oldVnode.elm.parentNode
        parent.insertBefore(newDom, oldVnode.elm)
        // 删除旧节点
        parent.removeChild(oldVnode.elm)
    }
}

// TODO: 判断是否是虚拟节点,还是DOM节点
function isVnode (vnode) {
    return vnode.sel
}

// TODO: 将 dom元素 包装成虚拟节点输出
function emptyNodeAt (dom) {
    let sel = dom.tagName.toLowerCase()
    return vnode(sel, {}, [], undefined, dom)
}

// TODO: 判断是否是同一个虚拟节点
function sameVnode (oldVnode, newVnode) {
    return oldVnode.sel === newVnode.sel && oldVnode.key === newVnode.key
}

